/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.losalpes.persistence.entity;

import java.io.Serializable;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;

/**
 * @author Luis Fernando Martinez Moreno
 */
@Entity
@NamedQueries({@NamedQuery(name = "Cliente.findAll", query = "select o from Cliente o"),
               @NamedQuery(name="Cliente.findByUsuario", query="select o from Cliente o where o.usuario = :usuario")
})
public class Cliente implements Serializable {

    @Id
    private String numeroDocumento;
    //@OneToMany(mappedBy = "cliente", cascade = {CascadeType.ALL})
    //private List<Compra> compras;
    private TipoDocumento tipoDocumento;
    private String nombre;
    private String telefonoResidencia;
    private String telefonoCelular;
    private String direccion;
    private String ciudadResidencia;
    private String departamento;
    private String pais;
    private String profesion;
    private String email;    
    @OneToOne (cascade={CascadeType.ALL})
    private Usuario usuario;

    /**
     * Construye cliente
     * @param tipoDocumento tipo de documento del cliente
     * @param numeroDocumento numero de documento del cliente
     * @param nombre nombre del cliente
     * @param email mail del cliente
     */
    public Cliente(TipoDocumento tipoDocumento, String numeroDocumento, String nombre, String email) {
        this.tipoDocumento = tipoDocumento;
        this.numeroDocumento = numeroDocumento;
        this.nombre = nombre;
        this.email = email;
    }

    /**
     * crea una instancia de cliente
     */
    public Cliente() {
        this.usuario = new Usuario();
    }

    /**
     * retorna la ciudad de residencia del cliente
     * @return ciudad de residencia
     */
    public String getCiudadResidencia() {
        return ciudadResidencia;
    }

    /**
     * modifica la ciudad de residencia del cliente
     * @param nueva ciudad de residencia
     */
    public void setCiudadResidencia(String ciudadderesidencia) {
        this.ciudadResidencia = ciudadderesidencia;
    }

    /**
     * Obteiene el departamento del cliente
     * @return departamento
     */
    public String getDepartamento() {
        return departamento;
    }

    /**
     * Modifica el departamento del cliente.
     * @param departamento Departamento nuevo
     */
    public void setDepartamento(String departamento) {
        this.departamento = departamento;
    }

    /**
     * retorna la dirección del cliente
     * @return dirección del cliente
     */
    public String getDireccion() {
        return direccion;
    }

    /**
     * modifica la dirección del cliente
     * @param direccion dirección del cliente.
     */
    public void setDireccion(String direccion) {
        this.direccion = direccion;
    }

    /**
     * retorna el e-mail del clente
     * @return e-mail del cliente
     */
    public String getEmail() {
        return email;
    }

    /**
     * modifica el e-mail del cliente
     * @param email e-mail nuevo del cliente
     */
    public void setEmail(String email) {
        this.email = email;
    }

    /**
     * retorna el nombre del cliente
     * @return nombre del cliente
     */
    public String getNombre() {
        return nombre;
    }

    /**
     * modifica el nombre del cliente
     * @param nombre nombre del cliente modificado
     */
    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    /**
     * retorna el número de identificación del cliente
     * @return número de identificación
     */
    public String getNumeroDocumento() {
        return numeroDocumento;
    }

    /**
     * Modifica el número del documento del cliente
     * @param numeroDocumento número de documento
     */
    public void setNumeroDocumento(String numeroDocumento) {
        this.numeroDocumento = numeroDocumento;
    }

    /**
     * Retorna el país del cliente
     * @return País del cliente
     */
    public String getPais() {
        return pais;
    }

    /**
     * Modifica el país del cliente
     * @param pais País del cliente
     */
    public void setPais(String pais) {
        this.pais = pais;
    }

    /**
     * Retorna la profesión del cliente
     * @return Profesión del cliente
     */
    public String getProfesion() {
        return profesion;
    }

    /**
     * Modifica la profesión del cliente
     * @param profesion Profesión del cliente
     */
    public void setProfesion(String profesion) {
        this.profesion = profesion;
    }

    /**
     * Retorna el teléfono celular del cliente
     * @return celular del cliente
     */
    public String getTelefonoCelular() {
        return telefonoCelular;
    }

    /**
     * Modifica el teléfono celular del cliente
     * @param telefonocelular teléfono celular del cliente
     */
    public void setTelefonoCelular(String telefonocelular) {
        this.telefonoCelular = telefonocelular;
    }

    /**
     * Obtiene el telèfono de residencia del cliente
     * @return nùmero de telèfono
     */
    public String getTelefonoResidencia() {
        return telefonoResidencia;
    }

    /**
     * Modifica el número de teléfono del cliente
     * @param telefonoResidencia número de teléfono de residencia del cliente
     */
    public void setTelefonoResidencia(String telefonoResidencia) {
        this.telefonoResidencia = telefonoResidencia;
    }

    /**
     * Obtiene el elemento de tipo TipoDocumento del cliente
     * @return TipoDocumento
     */
    public TipoDocumento getTipoDocumento() {
        return tipoDocumento;
    }

    /**
     * Modifica el tipo de documento del cliente
     * @param tipoDocumento nuevo tipo de documento del cliente
     */
    public void setTipoDocumento(TipoDocumento tipoDocumento) {
        this.tipoDocumento = tipoDocumento;
    }

    /**
     * Retorna el usuario que identifica al cliente.
     * @return usuario
     */
    public Usuario getUsuario() {
        return usuario;
    }

    /**
     * Modifica el usuario asociado al cliente
     * @param usuario
     */
    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }
    
    @Override
    public boolean equals(Object obj) {
        if (obj instanceof Cliente) {
            Cliente c = (Cliente) obj;
            return c.getNumeroDocumento().equals(this.numeroDocumento);
        } else {
            return false;
        }
    }

    @Override
    public int hashCode() {
        int hash = 7;
        hash = 29 * hash + (this.numeroDocumento != null ? this.numeroDocumento.hashCode() : 0);
        hash = 29 * hash + (this.telefonoCelular != null ? this.telefonoCelular.hashCode() : 0);
        return hash;
    }
}